package controlador;

import hbt.HibernateDAO;

import java.util.ArrayList;
import java.util.List;

import util.gestorFecha;
import dominioDAO.ClienteDao;
import dominioDAO.CotizacionDAO;
import dominioDAO.ListaPreciosDAO;
import dominioDAO.OrdenPedidoClienteDAO;
import dominioDAO.RemitoClienteDAO;
import dominioDAO.RodamientoDAO;
import dominioEntity.Cotizacion;
import dominioEntity.ItemCotizacion;
import dominioEntity.ItemListaPrecios;
import dominioEntity.OrdenPedidoCliente;
import dominioEntity.RemitoCliente;
import dominioEntity.Rodamiento;
import dominioTO.ItemCotizacionTO;
import dominioTO.OrdenPedidoClienteTO;

public class ODV {
	private static ODV instancia;
	
	
	
	public static ODV getInstancia()
	{
		if(instancia==null)
		{
			instancia=new ODV();
		}
		return instancia;
	}
	public ODV() {
		super();
		// TODO Auto-generated constructor stub
	}
	public List<Cotizacion> getCotizacionesPendientes()
	{
		return CotizacionDAO.getInstancia().getCotizacionesPendientes(Cotizacion.Pendiente);
	}
	
	//Por Hql valido que el rodamiento solicitado exista en la Cotizacion enviada, y busco el precio.
	public ItemCotizacion getItemCotizacionOPCliente(Integer nroCotizacion, Rodamiento rod, Integer cantidad)
	{
		
		ItemCotizacion item = CotizacionDAO.getInstancia().buscarItemCotizacion(nroCotizacion, rod, cantidad);
		ItemCotizacion itemCotizacionOP = new ItemCotizacion();
		itemCotizacionOP.setPrecio(item.getPrecio());
		itemCotizacionOP.setCantidad(cantidad);
		itemCotizacionOP.setItemListaPrecio(item.getItemListaPrecio());
		itemCotizacionOP.setRodamiento(item.getRodamiento());
		
		return itemCotizacionOP;
	}
	
	
	public void altaOrdenPedidoCliente(OrdenPedidoClienteTO dto)
	{
		OrdenPedidoCliente OPCliente = new OrdenPedidoCliente();
		OPCliente.setFecha(gestorFecha.getFechaHoy());
		OPCliente.setCliente(ClienteDao.getInstancia().buscarCliente(dto.getCliente().getCuit()));
		OPCliente.setOrdenPedidoDelCliente(dto.getOrdenPedidoDelCliente());
		OPCliente.setEstado(OrdenPedidoCliente.Aceptada);
		
		
		List<ItemCotizacion> itemCotizaciones = new ArrayList<ItemCotizacion>();

		for(ItemCotizacionTO itemTO: dto.getCotizaciones())
		{
			//Creeo el nuevo item de Cotizacion
			ItemCotizacion iCotizacion = new ItemCotizacion();
			//Busco Rodamiento Asociado
			Rodamiento rod = RodamientoDAO.getInstancia().getRodamiento(itemTO.getRodamiento());
			
			//Busco Item de la Lista precios del proveedor cotizado
			ItemListaPrecios itemListaPrecio = ListaPreciosDAO.getInstancia().buscarItemListaPrecios(itemTO.getItemListaPrecio().getId());
			
			iCotizacion.setItemListaPrecio(itemListaPrecio);			
			iCotizacion.setRodamiento(rod);
			iCotizacion.setPrecio(itemTO.getPrecio());
			iCotizacion.setCantidad(itemTO.getCantidad());
			
			itemCotizaciones.add(iCotizacion);
		}
		OPCliente.setItemCotizaciones(itemCotizaciones);
		OrdenPedidoClienteDAO.getInstancia().grabar(OPCliente);
	}
	
	public List<RemitoCliente> verificarOrdenesClienteConSock()
	{
		//Creo el array que va a tener las ordenes cumplidas
		List<RemitoCliente> remitosCliente = new ArrayList<RemitoCliente>();
		
		//Busco las ordenes que estan pendientes de recibir la mercaderia
		List<OrdenPedidoCliente> OPCliente = OrdenPedidoClienteDAO.getInstancia().getOrdenPedidoPendientes(OrdenPedidoCliente.AceptadaPedidoRealizado);
		
		//Recorro cada una de las ordenes 
		for(OrdenPedidoCliente ordenCli :OPCliente)
		{
			//Seteo un flag que va a cambiar si alguna cotizacion no esta cumplida
			boolean flag = true;
			for(ItemCotizacion itemCotizacion: ordenCli.getItemsCotizados())
			{
				int a = itemCotizacion.getCantidad();
				int b = itemCotizacion.getStock();
				if(a!=b)
				{
					flag = false;
				}
			}
			if(flag)
			{
				RemitoCliente auxRemito = new RemitoCliente();
				auxRemito.setCliente(ordenCli.getCliente());
				auxRemito.setFechaEmision(gestorFecha.getFechaHoy());
				auxRemito.setNumeroRemitoCliente(RemitoClienteDAO.getInstancia().getNroRemito());
				auxRemito.setOrdenPedidoCliente(ordenCli);
				remitosCliente.add(auxRemito);
				
				ordenCli.setEstado(OrdenPedidoCliente.Entregado);
				OrdenPedidoClienteDAO.getInstancia().grabar(ordenCli);
			}
		}
		
		
		HibernateDAO.getInstancia().persistList2(remitosCliente);
		return remitosCliente;
	}
	
}
